import {
  Entity,
  PrimaryGeneratedColumn,
  Column,
  OneToMany,
  CreateDateColumn,
  UpdateDateColumn,
} from 'typeorm';
import { ApiHideProperty } from '@nestjs/swagger';
import {
  IsNumber,
  IsObject,
  IsOptional,
  IsString,
  ValidateNested,
} from 'class-validator';

import { DietFood } from '@/modules/app/entities';
import { Type } from 'class-transformer';

export class MicroElement {
  /**
   * 热量（千卡）
   */
  @IsNumber()
  @Column({ type: 'float' })
  caloriesPerGram?: number = 0;
  /**
   * 脂肪含量（克）
   */
  @IsNumber()
  @Column({ type: 'float' })
  fatPerGram?: number = 0;
  /**
   * 蛋白质含量（克）
   */
  @IsNumber()
  @Column({ type: 'float' })
  proteinPerGram?: number = 0;
  /**
   * 碳水化合物含量（克）
   */
  @IsNumber()
  @Column({ type: 'float' })
  carbsPerGram?: number = 0;
  /**
   * 钠含量（mg）
   */
  @IsNumber()
  @Column({ type: 'float' })
  sodiumPerGram?: number = 0;
  /**
   * 钾含量（克）
   */
  @IsNumber()
  @Column({ type: 'float' })
  potassiumPerGram?: number = 0;
  /**
   * 钙含量（克）
   */
  @IsNumber()
  @Column({ type: 'float' })
  calciumPerGram?: number = 0;
  /**
   * 维生素D含量（ug）
   */
  @IsNumber()
  @Column({ type: 'float' })
  vitaminDPerGram?: number = 0;
}

@Entity('foods')
export class Food {
  @PrimaryGeneratedColumn('increment')
  foodId: number;

  /**
   * 食物名称
   */
  @IsString()
  @Column()
  name: string;

  /**
   * 食物图片
   */
  @IsString()
  @Column()
  imageUrl: string;

  /**
   * 食物分类
   */
  @IsString()
  @Column()
  category: string;

  /**
   * 炎症指数
   */
  @IsNumber()
  @Column()
  /**
   * 开启了脚本，省略了以下，不走脚本需要加下面内容，去除 [= 0];
   * @IsOptional()
   * @Column({ type:number, default: 0 })
   */
  rating?: number = 0;

  /**
   * 微量元素
   */
  // ! mysql不建议用json，他会浪费空间，并且只有 mysql8 以上才支持，待验证
  @ValidateNested() // 启用嵌套对象的校验
  @Type(() => MicroElement) // 指定嵌套对象的类型
  @Column({ type: 'json' })
  microElement?: MicroElement;

  /**
   * 关联日志
   */
  @ApiHideProperty()
  @OneToMany(() => DietFood, (dietFood) => dietFood.food)
  dietFoods: DietFood[];

  @CreateDateColumn()
  createdAt?: Date;

  @UpdateDateColumn()
  updatedAt?: Date;

  @ApiHideProperty()
  @Column({ default: false, select: false })
  isDeleted?: boolean;
}
